R_Merge_Function_VS_Excel_Vlookup_Column_Match
数据分析网
This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
R中的merge函数类似于Excel中的Vlookup,可以实现对两个数据表进行匹配和拼接的功能。与Excel不同之处在于merge函数有4种匹配拼接模式,分别为inner,left,right和outer模式。
其中inner为默认的匹配模式。本篇文章我们将介绍merge函数的使用方法和4种拼接模式的区别。
1. Introduction to merge function
merge
函数的使用方法很简单,以下是官方的函数功能介绍和使用说明。
2. Description
Merge two data frames by common columns or row names, or do other versions of database join operations.
Usage
merge(x, y, ...)
## Default S3 method:
merge(x, y, ...)
## S3 method for class 'data.frame'
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"),
incomparables = NULL, ...)
In SQL database terminology, the default value of all = FALSE
gives a natural join, a special case of an inner join.
Specifying all.x = TRUE
gives a left (outer) join, all.y = TRUE
a right (outer) join, and both
(all = TRUE a (full) outer join. DBMSes do not match NULL records, equivalent to incomparables = NA in R.
merge
函数中第一个出现的数据表是拼接后的left部分,第二个出现的数据表是拼接后的right部分。merge默认会按照两个数据表中共有的字段名称进行匹配和拼接。
3. 读取并创建数据表
开始使用merge函数进行数据拼接之前先读取需要进行匹配的两个数据表,并命名为loan_status表和member_info表。
#读取并创建贷款状态数据表
loan_status=data.frame(read.csv('loan_status.csv',header = 1))
#读取并创建用户信息数据表
member_info=data.frame(read.csv('member_info.csv',header = 1))
4. 查看数据表
下面我们分别查看了两个数据表中的内容。这个示例中的两个数据表较小,可以完整显示出来,如果数据量较大的话可以就不能这么直观的查看了。
#查看贷款状态数据表
# loan_status
number_id <- c(1277178, 12345)
load_amount <- c(10000,1909)
term <- c("36 months", "20 monthes")
# Get details of or set aspects of the locale for the R process.
foo <- Sys.getlocale()
Sys.setlocale(locale="C")
Sys.setlocale("LC_COLLATE", "C")
# backup
Sys.setlocale("LC_ALL", locale = foo)
issue_d <- as.Date(c("02/27/92", "01/14/92"),"%m/%d/%y")
loan_status <- c("Fully Paid", "Current")
total_pymnt_inv <- c(12231.89, 3581.89)
total_rec_int <- c(2214.92,1600)
loan_status <- data.frame(number_id,
load_amount,
term,
issue_d,
loan_status,
total_pymnt_inv)
loan_status
#查看用户信息数据表
# member_info
member_id <- c(1277178, 12345)
grade <- c("B", "C")
emp_length <- c("10 + years", "5 years")
annual_inc <- c(24000, 30000)
member_info <- data.frame(member_id,
grade,
emp_length,
annual_inc)
#查看两个数据表的维度
# 对于较大的数据表,可以使用dim函数查看数据表的维度,下面我们分别查看了贷款状态表和用户信息表的维度。贷款状态表有27行7列,用户信息表有25行4列。
dim(loan_status);dim(member_info)
#查看贷款状态数据表
loan_status
#查看用户信息数据表
member_info
# 使用names函数查看两个数据表的列名称,下面分别显示了代码和列名称。可以发现,两个数据表中有一个共同的列member_id。
#查看两个数据表的列名称
names(loan_status);names(member_info)
# [1] "member_id" "loan_amnt" "term""issue_d" "loan_status" "total_pymnt_inv" "total_rec_int"
# [1] "member_id" "grade" "emp_length" "annual_inc"
5. inner匹配
inner模式是merge的默认匹配模式,我们通过下面的文氏图来说明inner的匹配方法。Inner模式提供在loan_status和member_info表中共有字段的匹配结果。也就是对两个的表交集部分进行匹配和拼接。单独只出现在一个表中的字段值不会参与匹配和拼接。从下面的匹配结果中也可以看出,共有22行,包含了loan_status和member_info的交集。
#inner模式匹配
merge(loan_status,member_info,by = 'member_id')
6. outer匹配
outer模式是两个表的汇总,将loan_status和member_info两个要匹配的两个表汇总在一起,生成一张汇总的唯一值数据表以及匹配结果。从结果中可以看出共包含30行数据,比两个表的行数都要多。并且在grade和其他字段包含Na值,这些是在两个表中匹配不到的内容。
#outer模式匹配
merge(loan_status,member_info,all=TRUE,sort=TRUE)
7. left匹配
left模式是左匹配,以左边的数据表loan_status为基础匹配右边的数据表member_info中的内容。匹配不到的内容以NaN值显示。在Excel中就好像将Vlookup公式写在了左边的表中。下面的文氏图说明了left模式的匹配方法。Left模式匹配的结果显示了所有左边数据表的内容,以及和右边数据表共有的内容。
以下为使用left模式匹配并拼接后的结果,loan_status在merge函数中第一个出现,因此为左表,member_grade第二个出现,为右表。匹配模式为all.x=TRUE。从结果中可以看出left匹配模式保留了一张完整的loan_status表,以此为基础对member_info表中的内容进行匹配。loan_status表中有5个member_id值在member_info中无法找到,因此grade字段显示为NA值。
#left模式匹配
merge(loan_status,member_info,all.x=TRUE,sort=TRUE)
8. right匹配
right与left模式正好相反,right模式是右匹配,以右边的数据表member_info为基础匹配左边的数据表loan_status。匹配不到的内容以NA值显示。下面通过文氏图说明right模式的匹配方法。Right模式匹配的结果显示了所有右边数据表的内容,以及和左边数据表共有的内容。
以下为使用right模式匹配拼接的结果,从结果表中可以看出right匹配模式保留了完整的member_info表,以此为基础对loan_status表进行匹配,在loan_status数据表中有3个条目在member_info数据表中无法找到,因此显示为了NA值。
#right模式匹配
merge(loan_status,member_info,all.y=TRUE,sort=TRUE)
LS0tDQp0aXRsZTogIlJfTWVyZ2VfRnVuY3Rpb25fVlNfRXhjZWxfVmxvb2t1cF9Db2x1bW5fTWF0Y2giDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCiAgICB0b2M6IHllcw0KLS0tDQoNCiMgUl9NZXJnZV9GdW5jdGlvbl9WU19FeGNlbF9WbG9va3VwX0NvbHVtbl9NYXRjaA0KDQo+IFvmlbDmja7liIbmnpDnvZFdKGh0dHA6Ly93d3cuYWZlbnhpLmNvbS9wb3N0LzQxNDMyKQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KUuS4reeahG1lcmdl5Ye95pWw57G75Ly85LqORXhjZWzkuK3nmoRWbG9va3Vw77yM5Y+v5Lul5a6e546w5a+55Lik5Liq5pWw5o2u6KGo6L+b6KGM5Yy56YWN5ZKM5ou85o6l55qE5Yqf6IO944CC5LiORXhjZWzkuI3lkIzkuYvlpITlnKjkuo5tZXJnZeWHveaVsOaciTTnp43ljLnphY3mi7zmjqXmqKHlvI/vvIzliIbliKvkuLppbm5lcu+8jGxlZnTvvIxyaWdodOWSjG91dGVy5qih5byP44CCDQoNCuWFtuS4rWlubmVy5Li66buY6K6k55qE5Yy56YWN5qih5byP44CC5pys56+H5paH56ug5oiR5Lus5bCG5LuL57uNbWVyZ2Xlh73mlbDnmoTkvb/nlKjmlrnms5Xlkow056eN5ou85o6l5qih5byP55qE5Yy65Yir44CCDQoNCiMjIDEuIEludHJvZHVjdGlvbiB0byBtZXJnZSBmdW5jdGlvbg0KDQpgbWVyZ2Vg5Ye95pWw55qE5L2/55So5pa55rOV5b6I566A5Y2V77yM5Lul5LiL5piv5a6Y5pa555qE5Ye95pWw5Yqf6IO95LuL57uN5ZKM5L2/55So6K+05piO44CCDQoNCmBgYHtyfQ0KI+afpeeci21lcmdl5biu5Yqp5L+h5oGvDQo/bWVyZ2UNCg0KYGBgDQoNCiMjIDIuIERlc2NyaXB0aW9uDQoNCk1lcmdlIHR3byBkYXRhIGZyYW1lcyBieSBjb21tb24gY29sdW1ucyBvciByb3cgbmFtZXMsIG9yIGRvIG90aGVyIHZlcnNpb25zIG9mIGRhdGFiYXNlIGpvaW4gb3BlcmF0aW9ucy4NCg0KVXNhZ2UNCmBgYHtyfQ0KbWVyZ2UoeCwgeSwgLi4uKQ0KDQojIyBEZWZhdWx0IFMzIG1ldGhvZDoNCm1lcmdlKHgsIHksIC4uLikNCg0KIyMgUzMgbWV0aG9kIGZvciBjbGFzcyAnZGF0YS5mcmFtZScNCm1lcmdlKHgsIHksIGJ5ID0gaW50ZXJzZWN0KG5hbWVzKHgpLCBuYW1lcyh5KSksDQogICAgICBieS54ID0gYnksIGJ5LnkgPSBieSwgYWxsID0gRkFMU0UsIGFsbC54ID0gYWxsLCBhbGwueSA9IGFsbCwNCiAgICAgIHNvcnQgPSBUUlVFLCBzdWZmaXhlcyA9IGMoIi54IiwiLnkiKSwNCiAgICAgIGluY29tcGFyYWJsZXMgPSBOVUxMLCAuLi4pDQpgYGANCg0KSW4gU1FMIGRhdGFiYXNlIHRlcm1pbm9sb2d5LCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgYWxsID0gRkFMU0VgIGdpdmVzIGEgbmF0dXJhbCBqb2luLCBhIHNwZWNpYWwgY2FzZSBvZiBhbiBpbm5lciBqb2luLiANCg0KU3BlY2lmeWluZyBgYWxsLnggPSBUUlVFYCBnaXZlcyBhIGxlZnQgKG91dGVyKSBqb2luLCBgYWxsLnkgPSBUUlVFYCBhIHJpZ2h0IChvdXRlcikgam9pbiwgYW5kIGBib3RoYCAoYWxsID0gVFJVRSBhIChmdWxsKSBvdXRlciBqb2luLiBEQk1TZXMgZG8gbm90IG1hdGNoIE5VTEwgcmVjb3JkcywgZXF1aXZhbGVudCB0byBpbmNvbXBhcmFibGVzID0gTkEgaW4gUi4NCg0KYG1lcmdlYOWHveaVsOS4reesrOS4gOS4quWHuueOsOeahOaVsOaNruihqOaYr+aLvOaOpeWQjueahGxlZnTpg6jliIbvvIznrKzkuozkuKrlh7rnjrDnmoTmlbDmja7ooajmmK/mi7zmjqXlkI7nmoRyaWdodOmDqOWIhuOAgm1lcmdl6buY6K6k5Lya5oyJ54Wn5Lik5Liq5pWw5o2u6KGo5Lit5YWx5pyJ55qE5a2X5q615ZCN56ew6L+b6KGM5Yy56YWN5ZKM5ou85o6l44CCDQoNCiMjIDMuIOivu+WPluW5tuWIm+W7uuaVsOaNruihqA0KDQrlvIDlp4vkvb/nlKhtZXJnZeWHveaVsOi/m+ihjOaVsOaNruaLvOaOpeS5i+WJjeWFiOivu+WPlumcgOimgei/m+ihjOWMuemFjeeahOS4pOS4quaVsOaNruihqO+8jOW5tuWRveWQjeS4umxvYW5fc3RhdHVz6KGo5ZKMbWVtYmVyX2luZm/ooajjgIINCmBgYHtyfQ0KI+ivu+WPluW5tuWIm+W7uui0t+asvueKtuaAgeaVsOaNruihqA0KbG9hbl9zdGF0dXM9ZGF0YS5mcmFtZShyZWFkLmNzdignbG9hbl9zdGF0dXMuY3N2JyxoZWFkZXIgPSAxKSkNCiPor7vlj5blubbliJvlu7rnlKjmiLfkv6Hmga/mlbDmja7ooagNCm1lbWJlcl9pbmZvPWRhdGEuZnJhbWUocmVhZC5jc3YoJ21lbWJlcl9pbmZvLmNzdicsaGVhZGVyID0gMSkpDQpgYGANCg0KIyMgNC4g5p+l55yL5pWw5o2u6KGoDQoNCuS4i+mdouaIkeS7rOWIhuWIq+afpeeci+S6huS4pOS4quaVsOaNruihqOS4reeahOWGheWuueOAgui/meS4quekuuS+i+S4reeahOS4pOS4quaVsOaNruihqOi+g+Wwj++8jOWPr+S7peWujOaVtOaYvuekuuWHuuadpe+8jOWmguaenOaVsOaNrumHj+i+g+Wkp+eahOivneWPr+S7peWwseS4jeiDvei/meS5iOebtOingueahOafpeeci+S6huOAgg0KYGBge3J9DQoj5p+l55yL6LS35qy+54q25oCB5pWw5o2u6KGoDQojIGxvYW5fc3RhdHVzDQpudW1iZXJfaWQgPC0gYygxMjc3MTc4LCAxMjM0NSkNCmxvYWRfYW1vdW50IDwtIGMoMTAwMDAsMTkwOSkNCnRlcm0gPC0gYygiMzYgbW9udGhzIiwgIjIwIG1vbnRoZXMiKQ0KDQojIEdldCBkZXRhaWxzIG9mIG9yIHNldCBhc3BlY3RzIG9mIHRoZSBsb2NhbGUgZm9yIHRoZSBSIHByb2Nlc3MuDQpmb28gPC0gU3lzLmdldGxvY2FsZSgpDQpTeXMuc2V0bG9jYWxlKGxvY2FsZT0iQyIpDQpTeXMuc2V0bG9jYWxlKCJMQ19DT0xMQVRFIiwgIkMiKQ0KIyBiYWNrdXANClN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsIGxvY2FsZSA9IGZvbykNCg0KaXNzdWVfZCA8LSBhcy5EYXRlKGMoIjAyLzI3LzkyIiwgIjAxLzE0LzkyIiksIiVtLyVkLyV5IikNCmxvYW5fc3RhdHVzIDwtIGMoIkZ1bGx5IFBhaWQiLCAiQ3VycmVudCIpDQp0b3RhbF9weW1udF9pbnYgPC0gYygxMjIzMS44OSwgMzU4MS44OSkNCnRvdGFsX3JlY19pbnQgPC0gYygyMjE0LjkyLDE2MDApDQoNCmxvYW5fc3RhdHVzIDwtIGRhdGEuZnJhbWUobnVtYmVyX2lkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9hbW91bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVfZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvYW5fc3RhdHVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9weW1udF9pbnYpDQpsb2FuX3N0YXR1cw0KDQoNCiPmn6XnnIvnlKjmiLfkv6Hmga/mlbDmja7ooagNCiMgbWVtYmVyX2luZm8NCm1lbWJlcl9pZCA8LSBjKDEyNzcxNzgsIDEyMzQ1KQ0KZ3JhZGUgPC0gYygiQiIsICJDIikNCmVtcF9sZW5ndGggPC0gYygiMTAgKyB5ZWFycyIsICI1IHllYXJzIikNCmFubnVhbF9pbmMgPC0gYygyNDAwMCwgMzAwMDApDQptZW1iZXJfaW5mbyA8LSBkYXRhLmZyYW1lKG1lbWJlcl9pZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wX2xlbmd0aCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGFubnVhbF9pbmMpDQoNCiPmn6XnnIvkuKTkuKrmlbDmja7ooajnmoTnu7TluqYNCiMg5a+55LqO6L6D5aSn55qE5pWw5o2u6KGo77yM5Y+v5Lul5L2/55SoZGlt5Ye95pWw5p+l55yL5pWw5o2u6KGo55qE57u05bqm77yM5LiL6Z2i5oiR5Lus5YiG5Yir5p+l55yL5LqG6LS35qy+54q25oCB6KGo5ZKM55So5oi35L+h5oGv6KGo55qE57u05bqm44CC6LS35qy+54q25oCB6KGo5pyJMjfooYw35YiX77yM55So5oi35L+h5oGv6KGo5pyJMjXooYw05YiX44CCDQpkaW0obG9hbl9zdGF0dXMpO2RpbShtZW1iZXJfaW5mbykNCg0KI+afpeeci+i0t+asvueKtuaAgeaVsOaNruihqA0KbG9hbl9zdGF0dXMNCg0KI+afpeeci+eUqOaIt+S/oeaBr+aVsOaNruihqA0KbWVtYmVyX2luZm8NCg0KIyDkvb/nlKhuYW1lc+WHveaVsOafpeeci+S4pOS4quaVsOaNruihqOeahOWIl+WQjeensO+8jOS4i+mdouWIhuWIq+aYvuekuuS6huS7o+eggeWSjOWIl+WQjeensOOAguWPr+S7peWPkeeOsO+8jOS4pOS4quaVsOaNruihqOS4reacieS4gOS4quWFseWQjOeahOWIl21lbWJlcl9pZOOAgg0KI+afpeeci+S4pOS4quaVsOaNruihqOeahOWIl+WQjeensA0KbmFtZXMobG9hbl9zdGF0dXMpO25hbWVzKG1lbWJlcl9pbmZvKQ0KDQojIFsxXSAibWVtYmVyX2lkIiAibG9hbl9hbW50IiAidGVybSIiaXNzdWVfZCIgImxvYW5fc3RhdHVzIiAidG90YWxfcHltbnRfaW52IiAidG90YWxfcmVjX2ludCINCiMgWzFdICJtZW1iZXJfaWQiICJncmFkZSIgImVtcF9sZW5ndGgiICJhbm51YWxfaW5jIg0KDQoNCmBgYA0KDQojIyA1LiBpbm5lcuWMuemFjQ0KDQppbm5lcuaooeW8j+aYr21lcmdl55qE6buY6K6k5Yy56YWN5qih5byP77yM5oiR5Lus6YCa6L+H5LiL6Z2i55qE5paH5rCP5Zu+5p2l6K+05piOaW5uZXLnmoTljLnphY3mlrnms5XjgIJJbm5lcuaooeW8j+aPkOS+m+WcqGxvYW5fc3RhdHVz5ZKMbWVtYmVyX2luZm/ooajkuK3lhbHmnInlrZfmrrXnmoTljLnphY3nu5PmnpzjgILkuZ/lsLHmmK/lr7nkuKTkuKrnmoTooajkuqTpm4bpg6jliIbov5vooYzljLnphY3lkozmi7zmjqXjgILljZXni6zlj6rlh7rnjrDlnKjkuIDkuKrooajkuK3nmoTlrZfmrrXlgLzkuI3kvJrlj4LkuI7ljLnphY3lkozmi7zmjqXjgILku47kuIvpnaLnmoTljLnphY3nu5PmnpzkuK3kuZ/lj6/ku6XnnIvlh7rvvIzlhbHmnIkyMuihjO+8jOWMheWQq+S6hmxvYW5fc3RhdHVz5ZKMbWVtYmVyX2luZm/nmoTkuqTpm4bjgIINCg0KYGBge3J9DQojaW5uZXLmqKHlvI/ljLnphY0NCm1lcmdlKGxvYW5fc3RhdHVzLG1lbWJlcl9pbmZvLGJ5ID0gJ21lbWJlcl9pZCcpDQpgYGANCg0KIyMgNi4gb3V0ZXLljLnphY0NCg0Kb3V0ZXLmqKHlvI/mmK/kuKTkuKrooajnmoTmsYfmgLvvvIzlsIZsb2FuX3N0YXR1c+WSjG1lbWJlcl9pbmZv5Lik5Liq6KaB5Yy56YWN55qE5Lik5Liq6KGo5rGH5oC75Zyo5LiA6LW377yM55Sf5oiQ5LiA5byg5rGH5oC755qE5ZSv5LiA5YC85pWw5o2u6KGo5Lul5Y+K5Yy56YWN57uT5p6c44CC5LuO57uT5p6c5Lit5Y+v5Lul55yL5Ye65YWx5YyF5ZCrMzDooYzmlbDmja7vvIzmr5TkuKTkuKrooajnmoTooYzmlbDpg73opoHlpJrjgILlubbkuJTlnKhncmFkZeWSjOWFtuS7luWtl+auteWMheWQq05h5YC877yM6L+Z5Lqb5piv5Zyo5Lik5Liq6KGo5Lit5Yy56YWN5LiN5Yiw55qE5YaF5a6544CCDQoNCmBgYHtyfQ0KI291dGVy5qih5byP5Yy56YWNDQptZXJnZShsb2FuX3N0YXR1cyxtZW1iZXJfaW5mbyxhbGw9VFJVRSxzb3J0PVRSVUUpDQpgYGANCg0KIyMgNy4gbGVmdOWMuemFjQ0KDQpsZWZ05qih5byP5piv5bem5Yy56YWN77yM5Lul5bem6L6555qE5pWw5o2u6KGobG9hbl9zdGF0dXPkuLrln7rnoYDljLnphY3lj7PovrnnmoTmlbDmja7ooahtZW1iZXJfaW5mb+S4reeahOWGheWuueOAguWMuemFjeS4jeWIsOeahOWGheWuueS7pU5hTuWAvOaYvuekuuOAguWcqEV4Y2Vs5Lit5bCx5aW95YOP5bCGVmxvb2t1cOWFrOW8j+WGmeWcqOS6huW3pui+ueeahOihqOS4reOAguS4i+mdoueahOaWh+awj+WbvuivtOaYjuS6hmxlZnTmqKHlvI/nmoTljLnphY3mlrnms5XjgIJMZWZ05qih5byP5Yy56YWN55qE57uT5p6c5pi+56S65LqG5omA5pyJ5bem6L655pWw5o2u6KGo55qE5YaF5a6577yM5Lul5Y+K5ZKM5Y+z6L655pWw5o2u6KGo5YWx5pyJ55qE5YaF5a6544CCDQoNCuS7peS4i+S4uuS9v+eUqGxlZnTmqKHlvI/ljLnphY3lubbmi7zmjqXlkI7nmoTnu5PmnpzvvIxsb2FuX3N0YXR1c+WcqG1lcmdl5Ye95pWw5Lit56ys5LiA5Liq5Ye6546w77yM5Zug5q2k5Li65bem6KGo77yMbWVtYmVyX2dyYWRl56ys5LqM5Liq5Ye6546w77yM5Li65Y+z6KGo44CC5Yy56YWN5qih5byP5Li6YWxsLng9VFJVReOAguS7jue7k+aenOS4reWPr+S7peeci+WHumxlZnTljLnphY3mqKHlvI/kv53nlZnkuobkuIDlvKDlrozmlbTnmoRsb2FuX3N0YXR1c+ihqO+8jOS7peatpOS4uuWfuuehgOWvuW1lbWJlcl9pbmZv6KGo5Lit55qE5YaF5a656L+b6KGM5Yy56YWN44CCbG9hbl9zdGF0dXPooajkuK3mnIk15LiqbWVtYmVyX2lk5YC85ZyobWVtYmVyX2luZm/kuK3ml6Dms5Xmib7liLDvvIzlm6DmraRncmFkZeWtl+auteaYvuekuuS4uk5B5YC844CCDQoNCmBgYHtyfQ0KI2xlZnTmqKHlvI/ljLnphY0NCm1lcmdlKGxvYW5fc3RhdHVzLG1lbWJlcl9pbmZvLGFsbC54PVRSVUUsc29ydD1UUlVFKQ0KYGBgDQoNCiMjIDguIHJpZ2h05Yy56YWNDQoNCnJpZ2h05LiObGVmdOaooeW8j+ato+WlveebuOWPje+8jHJpZ2h05qih5byP5piv5Y+z5Yy56YWN77yM5Lul5Y+z6L6555qE5pWw5o2u6KGobWVtYmVyX2luZm/kuLrln7rnoYDljLnphY3lt6bovrnnmoTmlbDmja7ooahsb2FuX3N0YXR1c+OAguWMuemFjeS4jeWIsOeahOWGheWuueS7pU5B5YC85pi+56S644CC5LiL6Z2i6YCa6L+H5paH5rCP5Zu+6K+05piOcmlnaHTmqKHlvI/nmoTljLnphY3mlrnms5XjgIJSaWdodOaooeW8j+WMuemFjeeahOe7k+aenOaYvuekuuS6huaJgOacieWPs+i+ueaVsOaNruihqOeahOWGheWuue+8jOS7peWPiuWSjOW3pui+ueaVsOaNruihqOWFseacieeahOWGheWuueOAgg0KDQrku6XkuIvkuLrkvb/nlKhyaWdodOaooeW8j+WMuemFjeaLvOaOpeeahOe7k+aenO+8jOS7jue7k+aenOihqOS4reWPr+S7peeci+WHunJpZ2h05Yy56YWN5qih5byP5L+d55WZ5LqG5a6M5pW055qEbWVtYmVyX2luZm/ooajvvIzku6XmraTkuLrln7rnoYDlr7lsb2FuX3N0YXR1c+ihqOi/m+ihjOWMuemFje+8jOWcqGxvYW5fc3RhdHVz5pWw5o2u6KGo5Lit5pyJM+S4quadoeebruWcqG1lbWJlcl9pbmZv5pWw5o2u6KGo5Lit5peg5rOV5om+5Yiw77yM5Zug5q2k5pi+56S65Li65LqGTkHlgLzjgIINCmBgYHtyfQ0KI3JpZ2h05qih5byP5Yy56YWNDQptZXJnZShsb2FuX3N0YXR1cyxtZW1iZXJfaW5mbyxhbGwueT1UUlVFLHNvcnQ9VFJVRSkNCmBgYA0KDQoNCg0KDQo=